package com.fys.api.gateway.filter;

import com.fys.api.gateway.constant.CookieConstant;
import com.fys.api.gateway.constant.RedisConstant;
import com.fys.api.gateway.util.CookieUtil;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;

/**
 * @Description:
 * 1.网关最好不好操作数据库，只操作redis。如果需要操作数据库，也是应该调用其他服务
 * 2.最好的方式是：其他服务修改某些值得时候发送一个消息，消息得接收者同步数据到redis中，网关只操作redis
 *
 * 3.分布式session vs oauth2.0和security结合使用
 * 4.拆分原则：
 * 如果是一个从头开始的项目，前期可能不知道哪些是公共服务，可以先做着，后期再剥离出来（好的架构是演进而来的）
 * 如果是一个已有的大型项目且经验丰富，那么你肯定知道哪些是公共服务，从一开始就可以剥离出来
 * 本项目的那些utils工具包就可以剥离出来共用
 * 每一个过滤器建议单独只处理细粒度的事情，比如此项目的买家端和卖家端的过滤器就定义了两个。
 * @Auther: fys
 * @Date: 2020-08-12 21:57
 */
//@Component
//public class AuthFilter extends ZuulFilter {
//    @Autowired
//    private StringRedisTemplate stringRedisTemplate;
//
//    @Override
//    public String filterType() {
//        return PRE_TYPE;
//    }
//
//    @Override
//    public int filterOrder() {
//        return PRE_DECORATION_FILTER_ORDER - 1;
//    }
//
//    @Override
//    public boolean shouldFilter() {
//        return true;
//    }
//
//    @Override
//    public Object run() throws ZuulException {
//        RequestContext requestContext = RequestContext.getCurrentContext();
//        HttpServletRequest request = requestContext.getRequest();
//
//        /**
//         * /order/create 只能买家访问（cookie里有openid）
//         * /order/finish 只能卖家访问（cookie里有token，并且对应redis的值）
//         * /product/list 都可访问
//         */
//        if ("/order/order/create".equals(request.getRequestURI())) {
//            Cookie cookie = CookieUtil.get(request, CookieConstant.OPENID);
//            if (cookie == null || StringUtils.isEmpty(cookie.getValue())) {
//                requestContext.setSendZuulResponse(false);
//                requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
//            }
//        }
//
//        if ("/order/order/finish".equals(request.getRequestURI())) {
//            Cookie cookie = CookieUtil.get(request, CookieConstant.TOKEN);
//            if (cookie == null || StringUtils.isEmpty(cookie.getValue())
//                || StringUtils.isEmpty(stringRedisTemplate.opsForValue().get(String.format(RedisConstant.TOKEN_TEMPLATE, cookie.getValue()))) ) {
//                requestContext.setSendZuulResponse(false);
//                requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
//            }
//        }
//        return null;
//    }
//}
